<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    function fn(){  // 函数也是一个特殊的实例化对象 (实例化对象都可以访问 Object.prototype.toString/valueOf => 用于转字符串/数字)

    }


    // 新增toString()  => 自己有先找自己的 
    // 函数在隐式转化过程中 先调用valueOf() 如果不存在valueOf(),在调用toString()
    fn.toString = function(){
        console.log("18:转字符串");
        return "你好";
    }

    fn.valueOf = function(){
        console.log("23:转数字");
        return 10;
    }


    // console.log(fn + "");
    // console.log(fn ==  "你好");
    // console.log(fn + 1);

    // var newFn = fn;   // 将函数赋值给新变量  打印函数 也会触发隐式转换 (先打印函数 在调用toString => 谷歌浏览器的问题)
    // var newFn = (function(){
    //     return fn;
    // });

    console.log(fn);



    var obj = {}
    // console.log(obj.toString());  // 默认顺着原型链访问toString (Object.prototype.toString)
    // console.log(obj.valueOf());  // 默认顺着原型链访问toString (Object.prototype.valueOf)


    // 对象在隐式转化过程中 先调用valueOf() 如果不存在valueOf(),在调用toString()
    var obj = {}
    obj.toString = function(){
        console.log("51:转字符串");
        return "你好";
    }

    obj.valueOf = function(){
        console.log("56:转数字");
        return 10;
    }

    // console.log(obj + ""); // 其他类型遇到 + 和 "" => 先隐式转化为字符串 再拼接
    // console.log(obj + 1); // 其他类型参与算术运算 => 先转数字,在运算
    // console.log(+obj); // 一元运算符 +1 -1 !1  
    // console.log(obj); 




</script>
</html>